package com.zf.nio.buffer;

import java.nio.ByteBuffer;

/**
 * 粘包和半包问题
 * @author Zhou Feng
 */
public class NianBanBaoByteBuffer {

    /**
     * 网络上有多条数据发送给服务端，他们之间用 “\n”分割
     * 但是在接收这些数据时，他们可能会被重组
     * Hello,world\n
     * I'm zhangsan\n
     * How are you?\n
     * 实际在接收时变成了项目两个 byteBuffer包(粘包和半包)
     * Hello,world\nI'm zhangsan\nHo
     * w are you?\n
     * 编程将数据恢复成原始的按 “\n”分隔的数据
     */
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(32);
        buffer.put("Hello,world\nI'm zhangsan\nHo".getBytes());
        split(buffer);
        buffer.put("w are you?\n".getBytes());
        split(buffer);


    }

    private static void split(ByteBuffer source) {
        source.flip();
        for (int i = 0; i < source.limit(); i++) {
            // 找到一条完整消息
            if (source.get(i) == '\n') {
                int length = i + 1 - source.position();
                // 把这条完整消息存入新的 ByteBuffer
                ByteBuffer target = ByteBuffer.allocate(length);
                // 从 source 读，向 target 写
                for (int j = 0; j < length; j++) {
                    target.put(source.get());
                }
                System.out.println(new String(target.array()));
            }
        }
        source.compact();
    }
}
